package com.vecspace.security.proxy.service;

import java.util.List;

import com.vecspace.sso.entity.AppFuncUrl;
import com.vecspace.sso.entity.AppFunctionAuth;
import com.vecspace.sso.entity.SSOTenant;
import com.vecspace.sso.entity.SSOTenantEx;
import com.vecspace.sso.entity.SSOUser;
import com.vecspace.sso.entity.UserBase;

/**
 * 获取用户的授权相关的信息
 * @author wanghua
 *
 */
public interface AuthorizeService {
	
	/**调用后台sso系统，判断用户名和密码是否匹配
	 * 
	 * @param loginId
	 * @param password
	 * @return 
	 * @author: wanghua
	 */
	String login(String loginId, String password) throws Exception;
	
	/**获取指定用户的注册信息
	 * 
	 * @param loginId
	 * @return
	 * @throws Exception 
	 * @author: wanghua
	 */
	SSOUser getUser(String loginId) throws Exception;
	
	/**获取指定用户的基本信息
	 * 
	 * @param loginId
	 * @return 
	 * @author: wanghua
	 */
	UserBase getUserBaseInfo(String loginId) throws Exception;
	
	/**判断loginToken是否有效，有效表示这是一个已经登录的用户
	 * @param loginToken
	 * @return
	 */
	boolean checkLoginToken(String loginToken) throws Exception;
	
	boolean resetPassword(String loginId, String oldPassword, String newPassword) throws Exception;
	
	/**获取所有授权的子节点
	 * 
	 * @param parentFuncCode
	 * @return
	 * @throws Exception 
	 * @author: wanghua
	 */
	List<AppFunctionAuth> getAuthFunctionTree(Long userId, String parentFuncCode) throws Exception;
	
	/**获取当前用户，parentFuncCode下的授权的子节点，仅仅返回这一级的节点，不包括孙节点。
	 * 
	 * @param tenantId
	 * @param appKey
	 * @param parentFuncCode
	 * @return
	 * @throws HException 
	 * @author: wanghua
	 */
	List<AppFunctionAuth> getAuthorizedChildrenFunctions(Long userId, Long tenantId, String appKey, String parentFuncCode) throws Exception;
	
	List<AppFunctionAuth> getAllAuthByTree(Long userId, Long tenantId, String appKey, String parentFuncCode);
	
	/**获取系统下的所有的功能，包括所有子、孙节点，其中AppFuncUrl.authType>0时表示此URL已授权能访问
	 * 
	 * @param loginId
	 * @param tenantId
	 * @param appKey
	 * @param parentFuncCode
	 * @return 
	 * @author: wanghua
	 */
	List<AppFuncUrl> getAuthFunctionUrlList(Long userId, Long tenantId, String appKey, String parentFuncCode);
	
	/**
	 * 获取SSO系统中的租户信息
	 * 
	 * @param customTenantId 第三方系统中的租户id
	 * @return 
	 * @author: wanghua
	 */
	SSOTenant getTenantByCustomId(String customTenantId);
	
	/**查询当前登录的用户直接以及间接可以访问的租户<br>
	 * 直接访问的租户：用户所属的部门，部门所属的租户<br>
	 * 间接访问的租户：直接租户的子租户（仅一级子租户，不递归）
	 * 
	 * @param userId
	 * @param tenantType 可以为空，为空时表示所有类型
	 * @return 
	 * @author: wanghua
	 */
	List<SSOTenantEx> getAccessableTenants(Long userId, String tenantType);
	
	/**userId是否有权限访问tenantId（检查用户是否可以访问某个租户）<br>
	 * 1、userId是customTenantId内的用户
	 * 2、userId是customTenantId的父租户内的用户
	 * @param userId
	 * @param customTenantId
	 * @return 
	 * @author: wanghua
	 */
	boolean isAccessable2Tenant(Long userId,String customTenantId);
	
	/**userId是否是customTenantId租户的上级租户的用户
	 * 
	 * @param userId
	 * @param customTenantId
	 * @return 
	 * @author: wanghua
	 */
	boolean isInParentTenant(Long userId, String customTenantId);
	
	List<UserBase> getAllUsers();
}
